
package com.smc.sys.model;

import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import com.smc.common.config.Global;
import com.smc.common.persistence.DataEntity;
// import com.smc.common.supcan.annotation.treelist.cols.SupCol;
import com.smc.common.utils.Collections3;

/**
 * 
 * @author zouqinghua
 * @date 2016年1月8日 下午3:36:05
 *
 */
public class User extends DataEntity<User> {

    private static final long serialVersionUID = 1L;
    public static final String ROLE_STAFF_ADMIN = "STAFF_ADMIN";
    public static final String ROLE_STAFF_AUTH = "STAFF_AUTH";
    public static final String ROLE_STAFF_FILE = "STAFF_FILE_ADMIN";
    public static final String ROLE_STAFF_HOMEWORK = "STAFF_FILE_HOMEWORK";
    public static final String ROLE_STAFF_HOMEWORK_ADMIN = "STAFF_FILE_HOMEWORK_ADMIN";
    public static final String USER_DTYPE_STAFF = "Staff";
    public static final String STAFF_LEADS_ADMIN = "STAFF_LEADS_ADMIN";
    public static final String STAFF_COURSE_CONFIG_ADMIN = "STAFF_COURSE_CONFIG_ADMIN";
    public static final String STAFF_QBS_ADMIN = "QBS_ADMINISTRATOR";
    public static final String STAFF_TAG_ADMIN = "KNWOLEDGE_GRAPH_SUPERADMIN";
    
    
    private Long id;
    private String dType; // 员工类型
    private String gender; // 性别
    private String token;
    private String status; // 状态
    private String accountType; // 账户类型
    private String roleType; // 账户类型

    private String loginName;// 登录名
    private String password;// 密码
    private String no; // 工号
    private String name; // 姓名
    private String email; // 邮箱
    private String phone; // 电话
    private String mobile; // 手机
    private String userType;// 用户类型
    private String loginIp; // 最后登陆IP
    private Date loginDate; // 最后登陆日期
    private String loginFlag; // 是否允许登陆
    private String photo; // 头像

    private String oldLoginName;// 原登录名
    private String newPassword; // 新密码

    private String oldLoginIp; // 上次登陆IP
    private Date oldLoginDate; // 上次登陆日期

    private Role role; // 根据角色查询用户条件

    private List<Role> roleList = Lists.newArrayList(); // 拥有角色列表

    private List<String> roleCodeList; // 对应的角色列表
    private List<String> permissionCodeList = Lists.newArrayList();

    public User() {
        super();
        this.loginFlag = Global.YES;
    }

    public User(Long id) {
        super(id);
    }

    public User(Long id, String loginName) {
        super(id);
        this.loginName = loginName;
    }

    public User(Role role) {
        super();
        this.role = role;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getLoginFlag() {
        return loginFlag;
    }

    public void setLoginFlag(String loginFlag) {
        this.loginFlag = loginFlag;
    }

    // @SupCol(isUnique="true", isHide="true")
    // @ExcelField(title="ID", type=1, align=2, sort=1)
    public Long getId() {
        return this.id;
    }
    
    public void setId(Long id) {
		this.id = id;
	}

	@Length(min = 1, max = 100, message = "登录名长度必须介于 1 和 100 之间")
    // @ExcelField(title="登录名", align=2, sort=30)
    public String getLoginName() {
        return loginName;
    }

    public String getdType() {
        return dType;
    }

    public void setdType(String dType) {
        this.dType = dType;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getAccountType() {
        return accountType;
    }

    public void setAccountType(String accountType) {
        this.accountType = accountType;
    }

    public String getRoleType() {
        return roleType;
    }

    public void setRoleType(String roleType) {
        this.roleType = roleType;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    @JsonIgnore
    @Length(min = 1, max = 100, message = "密码长度必须介于 1 和 100 之间")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Length(min = 1, max = 100, message = "姓名长度必须介于 1 和 100 之间")
    // @ExcelField(title="姓名", align=2, sort=40)
    public String getName() {
        return name;
    }

    @Length(min = 1, max = 100, message = "工号长度必须介于 1 和 100 之间")
    // @ExcelField(title="工号", align=2, sort=45)
    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Email(message = "邮箱格式不正确")
    @Length(min = 0, max = 200, message = "邮箱长度必须介于 1 和 200 之间")
    // @ExcelField(title="邮箱", align=1, sort=50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Length(min = 0, max = 200, message = "电话长度必须介于 1 和 200 之间")
    // @ExcelField(title="电话", align=2, sort=60)
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Length(min = 0, max = 200, message = "手机长度必须介于 1 和 200 之间")
    // @ExcelField(title="手机", align=2, sort=70)
    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    // @ExcelField(title="备注", align=1, sort=900)
    public String getRemarks() {
        return remarks;
    }

    @Length(min = 0, max = 100, message = "用户类型长度必须介于 1 和 100 之间")
    // @ExcelField(title="用户类型", align=2, sort=80, dictType="sys_user_type")
    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    // @ExcelField(title="创建时间", type=0, align=1, sort=90)
    public Date getCreateDate() {
        return createDate;
    }

    // @ExcelField(title="最后登录IP", type=1, align=1, sort=100)
    public String getLoginIp() {
        return loginIp;
    }

    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    // @ExcelField(title="最后登录日期", type=1, align=1, sort=110)
    public Date getLoginDate() {
        return loginDate;
    }

    public void setLoginDate(Date loginDate) {
        this.loginDate = loginDate;
    }

    public String getOldLoginName() {
        return oldLoginName;
    }

    public void setOldLoginName(String oldLoginName) {
        this.oldLoginName = oldLoginName;
    }

    public String getNewPassword() {
        return newPassword;
    }

    public void setNewPassword(String newPassword) {
        this.newPassword = newPassword;
    }

    public String getOldLoginIp() {
        if (oldLoginIp == null) {
            return loginIp;
        }
        return oldLoginIp;
    }

    public void setOldLoginIp(String oldLoginIp) {
        this.oldLoginIp = oldLoginIp;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getOldLoginDate() {
        if (oldLoginDate == null) {
            return loginDate;
        }
        return oldLoginDate;
    }

    public void setOldLoginDate(Date oldLoginDate) {
        this.oldLoginDate = oldLoginDate;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    @JsonIgnore
    // @ExcelField(title="拥有角色", align=1, sort=800, fieldType=RoleListType.class)
    public List<Role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }

    @JsonIgnore
    public List<String> getRoleIdList() {
        List<String> roleIdList = Lists.newArrayList();
//        for (Role role : roleList) {
//            roleIdList.add(role.getId());
//        }
        return roleIdList;
    }
    
    public List<String> getRoleCodeList(){
    	List<String> roleCodeList = Lists.newArrayList();
    	List<Role> roleList = getRoleList();
    	if(CollectionUtils.isNotEmpty(roleList)){
    		for (Role role : roleList) {
    			roleCodeList.add(role.getCode());
			}
    	}
    	return roleCodeList;
    }
    

    public void setRoleCodeList(List<String> roleCodeList) {
        roleList = Lists.newArrayList();
        if (roleCodeList != null && roleCodeList.size() > 0) {
            for (String roleCode : roleCodeList) {
                roleList.add(new Role(roleCode));
            }
        }
    }
    
    public void setRoleIdList(List<String> roleIdList) {
        roleList = Lists.newArrayList();
//        for (String roleId : roleIdList) {
//            Role role = new Role();
//            role.setId(roleId);
//            roleList.add(role);
//        }
    }

    /**
     * 用户拥有的角色名称字符串, 多个角色名称用','分隔.
     */
    public String getRoleNames() {
        return Collections3.extractToString(roleList, "name", ",");
    }


    public Boolean isAdmin() {
        Boolean isAdmin = false;
        List<String> roleCodeList = getRoleCodeList();
        if(CollectionUtils.isNotEmpty(roleCodeList)){
        	for (String roleCode : roleCodeList) {
        		if (ROLE_STAFF_ADMIN.equalsIgnoreCase(roleCode)) {
        			isAdmin = true;
        			break;
        		}
			}
        }
        return isAdmin;
    }
    
    public Boolean isStaff() {
        Boolean isStaff = false;
        if (USER_DTYPE_STAFF.equalsIgnoreCase(this.dType)) {
            isStaff = true;
        }
        return isStaff;
    }
    
    public Boolean isFileManager() {
        Boolean isStaff = false;
        List<String> roleCodeList = getRoleCodeList();
        if(CollectionUtils.isNotEmpty(roleCodeList)){
        	for (String roleCode : roleCodeList) {
        		if (ROLE_STAFF_FILE.equalsIgnoreCase(roleCode)) {
        			isStaff = true;
        			break;
        		}
			}
        }
        return isStaff;
    }
    
    public Boolean isHomeworkMember() {
        Boolean isStaff = false;
        List<String> roleCodeList = getRoleCodeList();
        if(CollectionUtils.isNotEmpty(roleCodeList)){
        	for (String roleCode : roleCodeList) {
        		if (ROLE_STAFF_HOMEWORK.equalsIgnoreCase(roleCode)) {
        			isStaff = true;
        			break;
        		}
			}
        }
        return isStaff;
    }
    
    public Boolean isHomeworkManager() {
        Boolean isStaff = false;
        List<String> roleCodeList = getRoleCodeList();
        if(CollectionUtils.isNotEmpty(roleCodeList)){
        	for (String roleCode : roleCodeList) {
        		if (ROLE_STAFF_HOMEWORK_ADMIN.equalsIgnoreCase(roleCode)) {
        			isStaff = true;
        			break;
        		}
			}
        }
        return isStaff;
    }
    
    public Boolean isCourseConfigManager() {
        Boolean isStaff = false;
        List<String> roleCodeList = getRoleCodeList();
        if(CollectionUtils.isNotEmpty(roleCodeList)){
        	for (String roleCode : roleCodeList) {
        		if (STAFF_COURSE_CONFIG_ADMIN.equalsIgnoreCase(roleCode)) {
        			isStaff = true;
        			break;
        		}
			}
        }
        return isStaff;
    }
    
    @Override
    public String toString() {
    	return (id == null ? "" : id) + "|" + (loginName == null ? "" : loginName);
    }

	public String getUsername() {
		return loginName;
	}

	public void setUsername(String username) {
		this.loginName = username;
	}
	
	public List<String> getPermissionCodeList() {
	    if (permissionCodeList == null) {
	      permissionCodeList = Lists.newArrayList();
	    }
	    return permissionCodeList;
	  }

	  public void setPermissionCodeList(List<String> permissionCodeList) {
	    this.permissionCodeList = permissionCodeList;
	  }
	  
}